package dm.ast.model.gen.factory;

/**
 * @author weihuixin
 * @date 2024/2/29
 * @Description
 */
public class FactoryConstant extends BaseModelFactory {

    public static int MAX_WIDTH = 2000;//查询列的最大宽度，可用控制MEDIUM及以上复杂度
    public static int MAX_DEPTH = 10;//查询列的最大深度,仅用于控制复杂度为ExtraHard
    public static int MIN_WIDT_COMP = 50;// 含有一个层次子查询估算时，需要设置的最小宽度
    public static int MIN_EXP_WIDT = 10;//最小的复合表达式宽度
    public static int MAX_GROUPS = 9;// group子句中的分组项极值
    public static int MAX_GROUPBYCUBE = 9;//group子句中的分组项极值
    public static int MAX_INLEFTNUM = 4;// in表达式左操作数的最大列数 #########

    public static final int MAX_IFUN_WIDTH = 5;
    // HAVING子句限制
    public static int MAX_HAVING_WIDTH = 50;// having子句最长宽度
    public static int MAX_HAVING_DEPTH = 2;// having子句最大深度
    // WITH子句限制
    public static int MAX_WITH_CTES = 3;// with子句中CTE的最大数目

    //集合操作符
    public static int MAX_UNION_OPERATORS = 3;

    public static int MAX_CASE_WHEN = 10;

    //默认的极端分配权重比例
    public static int WEIGHT_EXTREME = 1;
    //默认的平均分配权重比例
    public static int WEIGHT_AVERAGE = 3;
    //默认的平均分配模板个数
    public static int COUNT_AVERAGE = 13;

    public static void setMaxWidth(int max) {
        MAX_WIDTH = max;
    }

    public static void setMaxDepth(int max) {
        if (max >= 6) {
            MAX_DEPTH = max;
        }
    }

    public static void setMinWidtComp(int min) {
        if (min > 5) {
            MIN_WIDT_COMP = min;
        }
    }
    
    public static void setMinExpWidt(int min) {
        if (min > 3) {
            MIN_EXP_WIDT = min;
        }
    }

    public static void setMaxWithCTES(int max) {
        MAX_WITH_CTES = max;
    }

    public static void setMaxCaseWhen(int max) {
        MAX_CASE_WHEN = max;
    }

    public static void setMaxUnionOperators(int maxUnionOperators) {
        MAX_UNION_OPERATORS = maxUnionOperators;
    }
}